#pragma once
#include <cstdarg>

// 日志开关（可根据需要移至单独的配置文件）
#define DEBUG 1

class Logger
{
  public:
    // 单例模式获取Logger实例
    static Logger& getInstance()
    {
        static Logger instance;
        return instance;
    }

    // 禁止拷贝构造和赋值操作
    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;

    // 调试日志（接收位置信息和可变参数）
    void debug(const char* file, const char* func, int line, const char* fmt,
               ...) const;

    // 错误日志（接收位置信息和可变参数）
    void error(const char* file, const char* func, int line, const char* fmt,
               ...) const;

  private:
    // 私有构造函数，确保单例
    Logger() = default;
};

// 宏定义：传递调用位置给Logger，并支持可变参数
#if DEBUG
#define Debug(fmt, ...)                                                        \
    Logger::getInstance().debug(__FILE__, __FUNCTION__, __LINE__, fmt,         \
                                ##__VA_ARGS__)
#define Error(fmt, ...)                                                        \
    Logger::getInstance().error(__FILE__, __FUNCTION__, __LINE__, fmt,         \
                                ##__VA_ARGS__)
#else
// 非调试模式下日志宏为空
#define Debug(fmt, ...)
#define Error(fmt, ...)
#endif